 /*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.core.resources.ant;

 import java.util.Hashtable ;
 import org.apache.tools.ant.*;
 import org.eclipse.ant.core.AntCorePlugin;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.*;

 /**
  * An Ant task which refreshes the Eclipse Platform's view of the local filesystem.
  *
  * @see IResource#refreshLocal(int, IProgressMonitor)
  */
 public class RefreshLocalTask extends Task {
     /**
      * Unique identifier constant (value <code>"DEPTH_ZERO"</code>)
      * indicating that refreshes should be performed only on the target
      * resource itself
      */
     public static final String DEPTH_ZERO = "zero"; //$NON-NLS-1$

     /**
      * Unique identifier constant (value <code>"DEPTH_ONE"</code>)
      * indicating that refreshes should be performed on the target
      * resource and its children
      */
     public static final String DEPTH_ONE = "one"; //$NON-NLS-1$

     /**
      * Unique identifier constant (value <code>"DEPTH_INFINITE"</code>)
      * indicating that refreshes should be performed on the target
      * resource and all of its recursive children
      */
     public static final String DEPTH_INFINITE = "infinite"; //$NON-NLS-1$

     /**
      * The resource to refresh.
      */
     protected IResource resource;

     /**
      * The depth to refresh to.
      */
     protected int depth = IResource.DEPTH_INFINITE;

     /**
      * Constructs a new <code>RefreshLocal</code> instance.
      */
     public RefreshLocalTask() {
         super();
     }

     /**
      * Performs the refresh operation.
      *
      * @exception BuildException thrown if a problem occurs during execution.
      */
     public void execute() throws BuildException {
         if (resource == null)
             throw new BuildException(Policy.bind("exception.resourceNotSpecified")); //$NON-NLS-1$
 try {
             IProgressMonitor monitor = null;
             Hashtable references = getProject().getReferences();
             if (references != null)
                 monitor = (IProgressMonitor) references.get(AntCorePlugin.ECLIPSE_PROGRESS_MONITOR);
             resource.refreshLocal(depth, monitor);
         } catch (CoreException e) {
             throw new BuildException(e);
         }
     }

     /**
      * Sets the depth of this task appropriately. The specified argument must
      * by one of <code>RefreshLocal.DEPTH_ZERO</code>, <code>RefreshLocal.DEPTH_ONE</code>
      * or <code>RefreshLocal.DEPTH_INFINITE</code>.
      *
      * @param value the depth to refresh to
      */
     public void setDepth(String value) {
         if (DEPTH_ZERO.equalsIgnoreCase(value))
             depth = IResource.DEPTH_ZERO;
         else if (DEPTH_ONE.equalsIgnoreCase(value))
             depth = IResource.DEPTH_ONE;
         else if (DEPTH_INFINITE.equalsIgnoreCase(value))
             depth = IResource.DEPTH_INFINITE;
     }

     /**
      * Sets the root of the workspace resource tree to refresh.
      *
      * @param value the root value
      */
     public void setResource(String value) {
         IPath path = new Path(value);
         resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
         if (resource == null) {
             // if it does not exist we guess it is a folder or a project
 if (path.segmentCount() > 1)
                 resource = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
             else {
                 resource = ResourcesPlugin.getWorkspace().getRoot().getProject(value);
                 if (!resource.exists())
                     log(Policy.bind("warning.projectDoesNotExist", value), Project.MSG_WARN); //$NON-NLS-1$
 }
         }
     }

 }

